home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 001 / mlpctalk.arc / MLPCTALK.DOC next >
Text File  |  1984-11-23  |  18KB  |  325 lines

  1.             Modifying PC-Talk to run under MultiLink
  2.  
  3. PC-Talk uses the SOUND statement for timing purposes.  Unfortunately,
  4. BASIC handles this by patching into the timer interrupt vector and
  5. stepping up the rate of interrupts drastically... works in a single-
  6. user system, but wreaks havoc under multitasking!
  7.  
  8. You can avoid this problem by locating all statements of the form
  9.  
  10.                           SOUND 32767,n
  11.  
  12. and replacing with a statement of the form
  13.  
  14.                       DELAY!=n:GOSUB 30000
  15.  
  16. where "n" is the specified number of timer ticks.
  17.  
  18. Then, add the following subroutine to the end of the program:
  19.  
  20. 30000 DEF SEG=0
  21. 30010 TWBEG!=PEEK(&H46C)+256*PEEK(&H46D)
  22. 30020 TWCUR!=PEEK(&H46C)+256*PEEK(&H46D)
  23. 30030 IF TWCUR!<TWBEG! THEN TWCUR!=TWCUR!+65536
  24. 30040 IF TWCUR!<(TWBEG!+DELAY!) THEN 30020
  25. 30050 RETURN
  26.  
  27. While you're at it, it's a good idea to simply remove all other SOUND
  28. and BEEP statements.  Cute little grunts and beeps are nice, but not
  29. when they threaten to crash your system.
  30. e
  31. 2110 DATA" Alt-S = Screendump   Alt-C = Clearsc
  32. 2115 DATA"  Alt-P =  communications Parameters
  33. 2120 DATA"  Alt-F =  set program deFaults
  34. 2125 DATA"  Alt-L =  change Logged drive
  35. 2130 DATA"  Alt-W =  set margin Width alarm
  36. 2135 DATA"  Alt-Z =  elapsed time/current call
  37. 2140 DATA"  Alt-X =  eXit to DOS
  38. 2145 DATA"Ctrl-End = send sustained Break signal
  39. 2150 '
  40. 2500 '
  41. 2505 Q$="":IF QL=0 THEN QL=255
  42. 2510 QI$=INKEY$:IF QI$="" THEN 2510
  43. 2515 IF QI$=CHR$(13) THEN RETURN
  44. 2520 IF QI$<>CHR$(8) THEN 2530 ELSE IF Q$="" THEN GOTO 2510
  45. 2525 IF QI$=CHR$(8) THEN GOSUB 2650:Q$=LEFT$(Q$,LEN(Q$)-1):GOTO 2510
  46. 2530 IF LEN(Q$)=QL THEN GOTO 2510
  47. 2535 IF LEN(QI$)=1 THEN 2545 ELSE IF QI$<>CHR$(0)+CHR$(3) THEN GOTO 2510 ELSE QI$=CHR$(0)
  48. 2545 IF ASC(QI$)>31 OR QI$=CHR$(27) THEN PRINT QI$; ELSE COLOR HI,BG:PRINT CHR$(ASC(QI$)+64);:COLOR FG,BG
  49. 2550 IF QI$=XCR$ THEN Q$=Q$+CHR$(13):GOTO 2510 ELSE Q$=Q$+QI$:GOTO 2510
  50. 2555 '
  51. 2560 FOR J=1 TO LEN(Q$):P=ASC(MID$(Q$,J,1)):IF P<97 OR P>122 THEN 2570
  52. 2565 MID$(Q$,J,1)=CHR$(P AND 95)
  53. 2570 NEXT:RETURN
  54. 2600 '
  55. 2605 MSG$=LEFT$(MSG$,78):ROW=CSRLIN:COL=POS(0):LOCATE 25,1:COLOR HI,BG:PRINT CHR$(16);:COLOR BG,FG:PRINT MSG$+SPACE$(78-LEN(MSG$));:COLOR FG,BG:LOCATE ROW,COL:RETURN
  56. 2650 '
  57. 2655 PRINT CHR$(29);" ";CHR$(29);:RETURN
  58. 2700 '
  59. 2705 CLOSE#2:IF RC THEN OPEN RCV$ FOR APPEND AS #2
  60. 2710 RETURN
  61. 2715 CLOSE#3:IF PR THEN OPEN PRNTPORT$ FOR OUTPUT AS #3
  62. 2720 IF TR THEN OPEN TRN$ AS #3 LEN=128:FIELD #3,128 AS X$
  63. 2725 RETURN
  64. 2800 '
  65. 2805 ROW=CSRLIN:COL=POS(0)
  66. 2810 EXIT=0:FOR I=1 TO 10:IF ALT$(I)<>"" THEN EXIT=-1:NEXT
  67. 2815 IF EXIT THEN EXIT=0:LOCATE ,,1:GOTO 1210
  68. 2820 IF MENU=0 THEN 2830
  69. 2825 LOCATE 25,1:PRINT" ";:COLOR BG,FG:PRINT"^PrtSc=prnt  Alt- T=tran R=recv V=view D=dial E=echo M=mesg X=exit <Home>=Help";:COLOR FG,BG:LOCATE ROW,COL:RETURN
  70. 2830 LOCATE 25,1:PRINT SPACE$(79);:LOCATE ROW,COL:RETURN
  71. 2835 '
  72. 3000 '
  73. 3010 IF RC THEN RC=0:RC$="":PRINT:PRINT"===RECEIPT OF FILE ";RCV$;" TERMINATED===":PRINT:GOSUB 2700:GOSUB 2800:IF MSG THEN PRINT#1,BL$;CR$;"===FILE RECEIVED===":GOTO 515 ELSE 515
  74. 3015 RC$="":PRINT:PRINT"===RECEIVE A FILE===":GOTO 3500
  75. 3020 IF RC$="X" THEN CLOSE#2:KILL RCV$:OPEN RCV$ AS #2 LEN=128:FIELD #2,128 AS X$:GOTO 3030
  76. 3025 IF MSG THEN PRINT#1,BL$;CR$;"===READY TO RECEIVE===
  77. 3030 MSG$=" Receiving "+RCVX$+"  (ALT-R to Terminate)":GOSUB 2600
  78. 3035 RC=-1:IF RC$="X" THEN 4500 ELSE 605
  79. 3040 '
  80. 3200 '
  81. 3210 IF TR THEN TR=0:TR$="":MSG1$="===TRANSMISSION OF FILE ":MSG2$=" TERMINATED===":PRINT:PRINT MSG1$;TRN$;MSG2$:GOSUB 2715:GOSUB 2800:IF MSG THEN PRINT#1,CR$;MSG1$;MSG2$,BL$:GOTO 515 ELSE 515
  82. 3215 IF TR THEN TR=0:TR$="":MSG1$="===END OF FILE":MSG2$="===":PRINT:PRINT MSG1$;" ";TRN$;MSG2$:GOSUB 2715:GOSUB 2800:IF MSG THEN PRINT#1,"65529 '";MSG1$;MSG2$;BL$:GOTO 515 ELSE 515
  83. 3220 TR$="":PRINT:PRINT"===TRANSMIT A FILE===":GOTO 3500
  84. 3225 CLOSE#3:OPEN TRN$ AS #3 LEN=128:FIELD #3,128 AS X$
  85. 3230 MSG$=" Transmitting "+TRNX$+" (ALT-T to terminate)":IF TR$="X" THEN MSG$=MSG$+"  # of blocks:" ELSE IF TR$="P" THEN MSG$=MSG$+"  percent remain:" ELSE MSG$=MSG$+"   min. remain:"
  86. 3235 GOSUB 2600:IF TR$="X" THEN ROW=CSRLIN:COL=POS(0):LOCATE 25,74:CNT!=FIX(LOF(3)/128):FLN!=LOF(3)/128:IF CNT!=FLN! THEN PRINT CNT!;:LOCATE ROW,COL ELSE PRINT CNT!+1;:LOCATE ROW,COL:GOTO 3245
  87. 3240 IF MSG THEN PRINT#1,CR$;"0 '===START OF FILE===";BL$
  88. 3245 TR=-1:FLN!=LOF(3):IF TR$<>"X" THEN 4000 ELSE 4700
  89. 3250 '
  90. 3400 '
  91. 3410 PRINT:PRINT"===VIEW A FILE===":GOTO 3500
  92. 3415 MSG$=" Viewing "+VEWX$+"  Hit <space> to continue  (Alt-V to terminate)":GOSUB 2600:PRINT:PRINT:PRINT
  93. 3420 WHILE NOT EOF(3):FOR I=1 TO 20:LINE INPUT#3,X$:J=LEN(X$):IF J<80 THEN PRINT X$ ELSE PRINT X$;:IF J>80 THEN I=I+FIX(J/80)
  94. 3425 NEXT
  95. 3430 Q$=INKEY$:IF Q$="" THEN 3430 ELSE IF Q$=" " THEN 3420 ELSE IF Q$=CHR$(0)+CHR$(47) THEN 3445 ELSE GOTO 3430
  96. 3435 WEND
  97. 3440 PRINT:PRINT"===END OF FILE ";VEW$;" ===":GOTO 3450
  98. 3445 PRINT:PRINT"===VIEWING OF FILE ";VEW$;" TERMINATED===
  99. 3450 GOSUB 2715:GOSUB 2800:GOTO 515
  100. 3455 '
  101. 3500 '
  102. 3510 EXIT=0:PRINT"   specification:";
  103. 3515 Q$=INKEY$:IF Q$="" THEN 3515 ELSE IF Q$=CR$ OR Q$=BS$ THEN FIL$="":PRINT:GOTO 3540
  104. 3520 IF LEN(Q$)>1 THEN Q=ASC(MID$(Q$,2,1)):IF Q>=59 AND Q<=68 THEN Q$=K$(Q-58) ELSE IF Q>=104 AND Q<=113 THEN Q$=K$(Q-93) ELSE IF Q>=84 AND Q<=103 THEN Q$=K$(Q-63) ELSE GOTO 3515
  105. 3525 IF Q$<>" " THEN PRINT Q$;:QL=128:GOSUB 2510:GOSUB 2555:FIL$=Q$:PRINT:LOCATE,,1:GOTO 3540
  106. 3530 IF EX=19 THEN FIL$=RCVX$ ELSE IF EX=20 THEN FIL$=TRNX$ ELSE IF EX=47 THEN FIL$=VEWX$
  107. 3535 Q$=FIL$:PRINT Q$;:QL=128:GOSUB 2510:GOSUB 2555:FIL$=Q$:PRINT:LOCATE,,1
  108. 3540 IF FIL$="" THEN PRINT"===CANCELLED===":GOTO 515
  109. 3545 IF LEFT$(FIL$,1)="?" THEN GOSUB 3625:GOTO 3510
  110. 3550 P=INSTR(FIL$,":"):IF P=0 THEN FIL$=DRIV$+FIL$
  111. 3555 IF EX=19 THEN RCVX$=FIL$ ELSE IF EX=20 THEN TRNX$=FIL$ ELSE IF EX=47 THEN VEWX$=FIL$
  112. 3560 P=INSTR(FIL$,"="):IF P=0 THEN IF EX<>20 OR PC$="" OR EXIT=-1 THEN 3595 ELSE EXIT=-1:Q$=FIL$+PC$:LOCATE CSRLIN-1,18:GOTO 3525
  113. 3565 Q$=RIGHT$(FIL$,LEN(FIL$)-P):FIL$=LEFT$(FIL$,P-1)
  114. 3570 IF Q$="B" THEN TR$="B"
  115. 3575 IF Q$="X" THEN IF EX=19 THEN RC$="X" ELSE IF EX=20 THEN TR$="X
  116. 3580 IF LEFT$(Q$,1)="P" THEN TR$="P":PROMPT$=RIGHT$(Q$,LEN(Q$)-1):DEL!=VAL(PROMPT$)
  117. 3585 IF TR$="B" OR TR$="X" OR RC$="X" THEN IF DTA$<>"8" THEN PRINT"*** You must communicate at 8 DATA BITS for binary or XMODEM ***":GOTO 5015
  118. 3590 IF TR$="X" OR RC$="X" THEN IF NS<>0 THEN PRINT"*** Stripping disabled for XMODEM ***":NS=0
  119. 3595 IF EX=19 THEN CLOSE#2:OPEN FIL$ FOR APPEND AS #2 ELSE CLOSE#3:OPEN FIL$ FOR INPUT AS #3
  120. 3600 PRINT STRING$(18+LEN(FIL$),61):IF EX=19 THEN RCV$=FIL$:GOTO 3020
  121. 3605 IF EX=20 THEN TRN$=FIL$:GOTO 3225
  122. 3610 IF EX=47 THEN VEW$=FIL$:GOTO 3415
  123. 3615 IF EX=21 THEN 3915
  124. 3620 '
  125. 3625 IF LEN(FIL$)=1 THEN FIL$=DRIV$+"*.*":GOTO 3640 ELSE FIL$=RIGHT$(FIL$,LEN(FIL$)-1):IF LEFT$(FIL$,1)=" " THEN FIL$=RIGHT$(FIL$,LEN(FIL$)-1)
  126. 3630 P=INSTR(FIL$,":"):IF P=0 THEN FIL$=DRIV$+FIL$
  127. 3635 IF LEN(FIL$)=P THEN FIL$=FIL$+"*.*
  128. 3640 PRINT:FILES FIL$:PRINT
  129. 3645 RETURN
  130. 3650 '
  131. 3800 '
  132. 3810 CLOSE#2:OPEN DUMP$ FOR APPEND AS #2:MSG$=" Appending to "+DUMP$+" at "+TIME$:GOSUB 2600 ' *ROD*
  133. 3815 FOR I=1 TO 24:Y$="":FOR J=1 TO 79:X=SCREEN(I,J):Y$=Y$+CHR$(X):NEXT J:PRINT#2,Y$:NEXT I:PRINT#2,STRING$(79,45);CR$;LF$;"===PC-TALK SCREENDUMP - ";DATE$;" at ";TIME$;"===";CR$;LF$;STRING$(79,61):CLOSE#2
  134. 3820 GOSUB 2705:GOSUB 2800:LOCATE ROW,COL:GOTO 515                     ' *ROD*
  135. 3825 '
  136. 3900 '
  137. 3910 PRINT:PRINT"===DELETE A FILE===":GOTO 3500
  138. 3915 PRINT"***The first 5 lines are:":FOR I=1 TO 5:IF NOT EOF(3) THEN LINE INPUT#3,X$:PRINT X$
  139. 3920 NEXT:PRINT"***ARE YOU SURE (y/n)?";:Q$=INPUT$(1):PRINT Q$:GOSUB 2555:IF Q$="Y" THEN CLOSE#3:KILL FIL$:PRINT" (deleted)":GOTO 3930
  140. 3925 PRINT" (not deleted)":PRINT GO$:GOTO 515
  141. 3930 PRINT GO$:GOTO 515
  142. 3935 '
  143. 4000 '
  144. 4010 IF TR$="B" THEN PRINT"(sending file as binary...)
  145. 4015 RATE!=VAL(BAU$)*6:CNT!=0:ROW=CSRLIN:COL=POS(0):GOTO 4060
  146. 4020 LOCATE 25,74:IF TR$<>"P" THEN PRINT USING"###.#";(FLN!-(CNT!*128))/RATE!; ELSE PRINT USING".##";(FLN!-CNT!*128)/FLN!;
  147. 4025 GET#3,CNT!:Y$=X$:LOCATE ROW,COL
  148. 4030 IF TR$="P" THEN GOSUB 4400:IF NOT ABORT THEN 4050 ELSE ABORT=0:GOTO 1500
  149. 4035 PRINT#1,Y$;:IF TR$="B" THEN 4050
  150. 4040 P=INSTR(1,Y$,LF$):IF P=0 THEN 4045 ELSE Y$=LEFT$(Y$,P-1)+RIGHT$(Y$,LEN(Y$)-P):GOTO 4040
  151. 4045 FOR I=1 TO 128:PRINT MID$(Y$,I,1);:NEXT
  152. 4050 ROW=CSRLIN:COL=POS(0):GOSUB 4070:B$=INKEY$:IF B$="" THEN 4060
  153. 4055 IF LEN(B$)>1 THEN 1500
  154. 4060 CNT!=CNT!+1:IF CNT!*128<FLN! THEN 4020 ELSE GET#3,CNT!:Y$=X$:GOTO 4200
  155. 4065 '
  156. 4070 IF EOF(1) THEN 4085 ELSE A$=INPUT$(LOC(1),#1)
  157. 4075 P=INSTR(1,A$,XF$):IF P<>0 THEN HLT=-1:COLOR HI,BG:PRINT"<<XOFF>>";:COLOR FG,BG
  158. 4080 IF HLT THEN P=INSTR(1,A$,XN$):IF P=0 THEN 4085 ELSE HLT=0:RETURN
  159. 4085 IF HLT THEN Q$=INKEY$:IF Q$<>"" THEN IF LEN(Q$)<>2 THEN 4070 ELSE IF ASC(RIGHT$(Q$,1))=24 THEN HLT=0:RETURN ELSE 4070 ELSE 4070
  160. 4090 RETURN
  161. 4200 '
  162. 4205 I=0:CNT!=(CNT!-1)*128
  163. 4210 I=I+1:CNT!=CNT!+1:IF I>255 THEN 4230 ELSE Z$=MID$(Y$,I,1)
  164. 4215 IF TR$="B" THEN IF CNT!<=FLN! THEN 4235 ELSE 4230
  165. 4220 IF Z$<>EF$ THEN 4235 ELSE 4230
  166. 4225 IF CNT!<=FLN! THEN 4235
  167. 4230 IF EOF(1) THEN 3215 ELSE DMMY$=INPUT$(LOC(1),#1):GOTO 4230
  168. 4235 IF TR$="P" THEN IF Z$=LF$ THEN 4210
  169. 4240 PRINT#1,Z$;:IF TR$="P" THEN IF Z$=CR$ THEN PRINT Z$;:GOSUB 4425:GOTO 4210
  170. 4245 IF TR$="B" OR Z$=LF$ THEN 4210
  171. 4250 PRINT Z$;:GOTO 4210
  172. 4400 '
  173. 4405 FOR I=1 TO LEN(Y$):Z$=MID$(Y$,I,1):IF Z$=LF$ THEN 4415 ELSE IF Z$<>CR$ THEN PRINT#1,Z$;:PRINT Z$;:GOTO 4415 ELSE PRINT #1," "+CR$;:PRINT CR$;:B$="":GOSUB 4420
  174. 4410 IF ABORT THEN RETURN
  175. 4415 NEXT:RETURN
  176. 4420 IF LEN(B$)>1 THEN ABORT=-1:RETURN
  177. 4425 IF (INP(LSR) AND 96)<>96 THEN 4425
  178. 4430 IF DEL!>0 THEN DELAY!=18*DEL!:GOSUB 30000:RETURN
  179. 4435 Z$="":WHILE NOT EOF(1):Z$=Z$+INPUT$(LOC(1),#1):WEND:PRINT Z$;:IF Z$="" THEN Z$=CHR$(0) ELSE IF LEN(Z$)>128 THEN Z$=""
  180. 4440 P=INSTR(Z$,PROMPT$):B$=INKEY$:IF P<>0 OR B$=" " THEN RETURN ELSE 4420
  181. 4445 '
  182. 4500 '
  183. 4510 PRINT"===RECEIVE FILE WITH XMODEM===":PRINT
  184. 4515 Y$="":BLK=1:SEC=1:CK=0:ECNT=0
  185. 4520 PRINT"***Holding for Start...":GOSUB 4975:PRINT#1,NAK$;
  186. 4525 GOSUB 4925:IF ABORT THEN 4645 ELSE 4535
  187. 4530 GOSUB 4905:IF Z$="" THEN 4545
  188. 4535 Y$=Y$+Z$:IF LEN(Y$)<=131 THEN 4530
  189. 4540 '
  190. 4545 IF LEN(Y$)=132 THEN LSET X$=MID$(Y$,4,128):N=132:GOTO 4580
  191. 4550 IF LEN(Y$)=131 THEN LSET X$=MID$(Y$,3,128):N=131:GOTO 4580
  192. 4555 IF LEN(Y$)>132 THEN PRINT"**Long  Block in #";BLK:GOTO 4615
  193. 4560 IF Y$=EOT$ THEN 4635
  194. 4565 IF Y$=CAN$ THEN 4640
  195. 4570 IF Y$="" THEN PRINT"***Timeout":GOSUB 4975:PRINT #1,NAK$:GOTO 4525
  196. 4575 PRINT"**Short Block in #";BLK:GOTO 4615
  197. 4580 IF (ASC(MID$(Y$,1,1)) AND ASC(MID$(Y$,2,1)) AND ASC(MID$(Y$,3,1)))<>0 THEN PRINT"**Error in SOH":Y$="":PRINT #1,NAK$:GOTO 4525
  198. 4585 IF ASC(MID$(Y$,2,1))=SEC-1 THEN PRINT"**Requesting Next Block":PRINT#1,ACK$:GOTO 4520
  199. 4590 IF SEC<>ASC(MID$(Y$,2,1)) THEN PRINT"**Block # Error in #";BLK:GOTO 4615
  200. 4595 IF (SEC XOR 255)<>ASC(MID$(Y$,3,1)) THEN PRINT"**Complement Error in #";BLK:GOTO 4615
  201. 4600 FOR I=1 TO 128:CK=CK+ASC(MID$(X$,I,1)):NEXT
  202. 4605 IF (CK AND 255)=(ASC(MID$(Y$,N,1))) THEN 4620
  203. 4610 PRINT"**Checksum Error in #";BLK:
  204. 4615 PRINT#1,NAK$;:ECNT=ECNT+1:IF ECNT<12 THEN 4625 ELSE 4645
  205. 4620 PRINT"Received Block #";BLK;:SEC=255 AND (SEC+1):PUT#2,BLK:BLK=BLK+1:PRINT#1,ACK$;:PRINT"- verified":ECNT=0
  206. 4625 Y$="":CK=0:GOSUB 4965:IF ABORT THEN 4645 ELSE 4530
  207. 4630 '
  208. 4635 PRINT"***End of File - verified":PRINT#1,ACK$;:GOTO 3010
  209. 4640 PRINT"***Cancelled by Transmitter":GOTO 3010
  210. 4645 PRINT"***Cancelled by Receiver":PRINT#1,CAN$;:GOSUB 4975:GOTO 3010
  211. 4650 '
  212. 4700 '
  213. 4710 PRINT"===TRANSMIT FILE WITH XMODEM===":PRINT
  214. 4715 SEC=0:BLK=0:CNT!=0:ECNT=0:EOT=0:ETT=0:GOSUB 4815
  215. 4720 PRINT"***Holding for Start...":GOSUB 4975:ABORT=0:SECZ=0:GOSUB 4985
  216. 4725 WHILE NOT EOF(1):Z$=INPUT$(1,#1)
  217. 4730 IF Z$=NAK$ THEN 4800
  218. 4735 IF Z$=CAN$ THEN 4855
  219. 4740 WEND:GOSUB 4965:IF ABORT THEN 4860
  220. 4745 GOSUB 4990:IF NOT TENSEC THEN 4725 ELSE GOSUB 4995:GOTO 4725
  221. 4750 '
  222. 4755 ABORT=0:SECZ=0:GOSUB 4985
  223. 4760 WHILE NOT EOF(1):Z$=INPUT$(LOC(1),#1)
  224. 4765 IF Z$=ACK$ THEN ECNT=0:PRINT "- verified ":IF NOT EOT THEN 4800 ELSE IF NOT ETT THEN 4845 ELSE 4850
  225. 4770 IF Z$=NAK$ THEN ECNT=ECNT+1:IF ECNT>12 THEN 4860 ELSE IF NOT EOT THEN 4805 ELSE 4845
  226. 4775 IF Z$=CAN$ THEN 4855
  227. 4780 WEND:GOSUB 4965:IF ABORT THEN 4860
  228. 4785 GOSUB 4990:IF NOT TENSEC THEN 4760
  229. 4790 GOSUB 4995:IF NOT ABORT THEN IF NOT EOT THEN 4805 ELSE 4845 ELSE 4860
  230. 4800 A$=Y$:PRINT"Sending Block #";BLK;:PRINT#1,A$;:IF CNT!<FLN! THEN GOSUB 4815:GOTO 4755 ELSE EOT=-1:GOTO 4755
  231. 4805 ECNT=ECNT+1:IF ECNT>12 THEN 4860 ELSE PRINT:PRINT"***Re-sending block...";:PRINT#1,A$;:GOTO 4755
  232. 4810 '
  233. 4815 BLK=BLK+1:CNT!=CNT!+128:GET#3,BLK:Y$=X$:IF CNT!<=FLN! THEN 4825
  234. 4820 Y$=MID$(Y$,1,128-(CNT!-FLN!))+STRING$(CNT!-FLN!,CHR$(0))
  235. 4825 CK=0:FOR I=1 TO LEN(Y$):CK=CK+ASC(MID$(Y$,I,1)):NEXT:CK=(CK AND 255)
  236. 4830 IF CK>256 THEN CK=CK-256:GOTO 4830
  237. 4835 SEC=(255 AND BLK):Y$=SOH$+CHR$(SEC)+CHR$(SEC XOR 255)+Y$+CHR$(CK):RETURN
  238. 4840 '
  239. 4845 PRINT#1,EOT$;:PRINT"***Sending End Marker ";:ETT =-1:GOTO 4755
  240. 4850 CLOSE #3:GOTO 3215
  241. 4855 PRINT:PRINT"***Cancelled by Receiver":CLOSE#3:GOTO 3210
  242. 4860 PRINT:PRINT"***Cancelled by Transmitter":CLOSE#3:PRINT#1,CAN$;:GOTO 3210
  243. 4865 '
  244. 4900 '
  245. 4905 Z$="":ZA=0
  246. 4910 IF NOT EOF(1) THEN Z$=INPUT$(LOC(1),#1):RETURN ELSE DELAY!=1:GOSUB 30000:ZA=ZA+1
  247. 4915 IF ZA>72 THEN RETURN ELSE 4910
  248. 4920 '
  249. 4925 ABORT=0:SECZ=0:GOSUB 4985
  250. 4930 GOSUB 4905:GOSUB 4965:IF ABORT THEN RETURN
  251. 4935 IF LEFT$(Z$,1)=SOH$ THEN RETURN
  252. 4940 IF LEFT$(Z$,1)=EOT$ THEN RETURN
  253. 4945 IF LEFT$(Z$,1)=CAN$ THEN RETURN
  254. 4950 GOSUB 4975:PRINT#1,NAK$;
  255. 4955 GOSUB 4990:IF NOT TENSEC THEN 4955 ELSE GOSUB 4995:GOTO 4930
  256. 4960 '
  257. 4965 B$=INKEY$:IF LEN(B$)<2 THEN RETURN ELSE Q$=MID$(B$,2,1):IF Q$=CHR$(19) OR Q$=CHR$(20) THEN ABORT=-1:RETURN ELSE RETURN
  258. 4970 '
  259. 4975 WHILE NOT EOF(1):Z$=INPUT$(LOC(1),#1):WEND:RETURN
  260. 4980 '
  261. 4985 SECX=60*VAL(MID$(TIME$,4,2))+VAL(MID$(TIME$,7,2)):RETURN
  262. 4990 TENSEC=0:SECY=60*VAL(MID$(TIME$,4,2))+VAL(MID$(TIME$,7,2)):IF SECY-SECX<10 THEN RETURN ELSE TENSEC=-1:RETURN
  263. 4995 IF SECZ<9 THEN GOSUB 4985:SECZ=SECZ+1:RETURN ELSE ABORT=-1:RETURN
  264. 4996 '
  265. 5000 '
  266. 5010 CLS:PRINT:PRINT"===COMMUNICATIONS PARAMETERS===
  267. 5015 PRINT:PRINT"Present parameters: ";:GOSUB 5100:PRINT"Options:
  268. 5020 PRINT"   1 -  300,E,7,1  (text)      2 -  300,N,8,1  (binary)
  269. 5025 PRINT"   3 - 1200,E,7,1  (text)      4 - 1200,N,8,1  (binary)
  270. 5030 PRINT SPACE$(15);"F - reset params to defaults
  271. 5035 PRINT SPACE$(15);"X - exit to terminal
  272. 5040 PRINT"Choose: ";
  273. 5045 Q$=INPUT$(1):GOSUB 2555
  274. 5050 IF Q$="X" THEN PRINT Q$:PRINT:PRINT"(Present parameters still in effect)":GOTO 5095
  275. 5055 IF Q$="F" THEN PRINT Q$:GOSUB 5815:PRINT:PRINT"Parameters reset to:";:GOSUB 5100:GOTO 5095
  276. 5060 Q=VAL(Q$):IF Q<1 OR Q>4 THEN GOTO 5045 ELSE PRINT Q
  277. 5065 BAU$="300":PAR$="E":DTA$="7":STP$="1
  278. 5070 IF Q=2 THEN PAR$="N":DTA$="8
  279. 5075 IF Q=3 THEN BAU$="1200
  280. 5080 IF Q=4 THEN BAU$="1200":PAR$="N":DTA$="8
  281. 5085 LOCATE ,,1:COMM$=COMMPORT$+BAU$+","+PAR$+","+DTA$+","+STP$+COMMINIT$:CLOSE#1:OPEN COMM$ AS #1
  282. 5090 PRINT:PRINT"New parameters are: ";:GOSUB 5100
  283. 5095 PRINT GO$:GOSUB 2800:GOTO 515
  284. 5100 COLOR BG,FG:PRINT MID$(COMM$,6,10);:COLOR FG,BG:PRINT:PRINT
  285. 5105 PRINT"Echo-";:IF ECH=-1 THEN PRINT"Y"; ELSE PRINT"N";
  286. 5110 PRINT" Mesg-";:IF MSG=-1 THEN PRINT"Y"; ELSE PRINT"N";
  287. 5115 PRINT" Strip-";:IF NS=0 THEN PRINT"N"; ELSE PRINT USING"#";NS;
  288. 5120 PRINT" Pace-";:IF PC$="" THEN PRINT"N" ELSE PRINT PC$
  289. 5125 IF NS=0 THEN PRINT:RETURN ELSE FOR I=1 TO NS:PRINT"Strip #";:PRINT USING"#";I;:PRINT" - /";:PRINT USING"###";ASC(S$(I));:PRINT"/";:IF R$(I)="" THEN PRINT"000"; ELSE PRINT USING"###";ASC(R$(I));
  290. 5130 PRINT"/":NEXT:PRINT:RETURN
  291. 5135 '
  292. 5200 '
  293. 5210 CLS:PRINT"===SET NEW DEFAULTS===":PRINT:COLOR BG,FG:PRINT" Present program defaults:";SPACE$(53);:COLOR FG,BG:EXIT=0
  294. 5215 FOR I=1 TO DFNUM:J=I+4:P=1:IF I>15 THEN J=I-11:P=32
  295. 5220 LOCATE J,P,0:PRINT DP$(I);:LOCATE J,P+16:IF D$(I)>=" " THEN PRINT D$(I); ELSE IF D$(I)="" THEN PRINT "''"; ELSE IF D$(I)=CHR$(0) THEN PRINT "0"; ELSE COLOR HI,BG:PRINT CHR$(ASC(D$(I))+64);:COLOR FG,BG
  296. 5225 IF I<15 THEN PRINT SPACE$(12-LEN(D$(I))); ELSE PRINT SPACE$(30-LEN(D$(I)));
  297. 5230 NEXT:LOCATE ,,1:IF EXIT THEN 5280
  298. 5235 LOCATE 21,1:COLOR BG,FG:PRINT" Enter ";ENT$;" to leave unchanged - <space>";ENT$;" for 'null' value - <ESC>";ENT$;" to quit ":COLOR FG,BG
  299. 5240 PRINT"*** Enter new values":ABORT=0:FOR I=1 TO DFNUM:J=I+4:P=1:IF I>15 THEN J=I-11:P=32
  300. 5245 IF ABORT THEN 5265
  301. 5250 IF D$(I)<>"" THEN LOCATE J,P+17+LEN(D$(I)) ELSE LOCATE J,P+19
  302. 5255 IF I>15 THEN QL=16 ELSE QL=4
  303. 5260 GOSUB 2500:IF Q$=CHR$(27) THEN GOSUB 2655:GOSUB 2655:ABORT=-1 ELSE IF Q$<>"" THEN D$(I)=Q$:IF D$(I)=" " THEN D$(I)=""
  304. 5265 NEXT
  305. 5270 GOSUB 5295:PRINT"*** New values ok (y/n)?";:Q$=INPUT$(1):PRINT Q$:GOSUB 2555:IF Q$="N" THEN GOSUB 5295:LOCATE 21,1:PRINT SPACE$(79);:LOCATE 21,1:PRINT"(default routine cancelled)":GOTO 5290
  306. 5275 EXIT=-1:GOSUB 5295:PRINT"*** Make these changes permanent (y/n)?";:Q$=INPUT$(1):PRINT Q$+" ...wait";:GOSUB 2555:IF Q$="Y" THEN GOSUB 5440:GOTO 5215 ELSE GOSUB 5600:GOTO 5215
  307. 5280 GOSUB 5815:CLOSE#1:OPEN COMM$ AS #1
  308. 5285 GOSUB 5295:LOCATE CSRLIN-1,1:PRINT SPACE$(79);:LOCATE CSRLIN,1
  309. 5290 COLOR FG,BG,BG:PRINT GO$:GOSUB 2800:GOTO 515
  310. 5295 LOCATE 22,1:PRINT SPACE$(79);:LOCATE 22,1:RETURN
  311. 5400 '
  312. 5405 RESTORE 5410:FOR I=1 TO DFNUM:READ DP$(I),D$(I):NEXT:GOSUB 5440:GOTO 300
  313. 5410 DATA Baud rate,300,Parity,E,Data bits,7,Stop bits,1,Echo,N,Messages,N
  314. 5415 DATA"Strip #1",0,Replace #1,0,"Strip #2",0,Replace #2,0,"Strip #3",0,Replace #3,0,Pacing p=,,Logged drive,"B:",Margin width,70
  315. 5420 DATA Screendump file,"B:SCRNDUMP.PCT",Redial delay,20,Connect prompt,CONNECT
  316. 5425 DATA Line 25 help,Y,Foreground,7,Background,0,High inten.,15
  317. 5430 DATA "Print port","LPT1:","Print init.",,"Print width",80
  318. 5435 DATA Comm. port,"COM1:",Comm. init.,",CS,DS",Modem init.,,C/R subst.,"}"
  319. 5440 CLOSE#1:OPEN FFIL$ FOR OUTPUT AS #1:WRITE#1,IFIL$:FOR I=1 TO DFNUM:WRITE#1,DP$(I),D$(I):NEXT:WRITE#1,IFIL$:GOSUB 5600:RETURN
  320. 5600 '
  321. 5605 BAU$=D$(1):PAR$=D$(2):DTA$=D$(3):STP$=D$(4)
  322. 5610 I=5:GOSUB 5805:IF D$(5)="Y" THEN DECH=-1 ELSE D$(5)="N":DECH=0
  323. 5615 I=6:GOSUB 5805:IF D$(6)="Y" THEN DMSG=-1 ELSE D$(6)="N":DMSG=0
  324. 5620 DNS=0:FOR J=1 TO 3:I=2*J+5:GOSUB 5810
  325. 5625 DS$(J)=CHR$(VAL(D$(I))):IF DS$(J)<>CHR$(0) THEN DNS=DNS+1 ELSE D$(I)